/**
 * Provides the event utilites used by library
 * @class _jsc.evt
 */

_jsc.evt = {
	
	gTar: function(oe) {
		if (_jsc.client.isIE) {
			return oe.srcElement;
		} else {
			return oe.target;
		}
	},
	
	/**
	 * Attach event handler to specified element's specified event.
	 * @method addEvent
	 * @param {HTML Object} specified element
	 * @param {String} specified event name without 'on'
	 * @param {Function} event handler
	 */
	addEvent: function(o, c, h) {
		if (_jsc.client.isIE) {
			o.attachEvent('on'+c, h);
		} else {
			o.addEventListener(c, h, false);
		};
		return true;
	},
	
	/**
	 * Detach event handler to specified element's specified event.
	 * @method removeEvent
	 * @param {HTML Object} specified element
	 * @param {String} specified event name without 'on'
	 * @param {Function} event handler
	 */
	removeEvent: function(o, h) {
		if (_jsc.client.isIE) {
			o.detachEvent('on'+c, h);
		} else {
			o.removeEventListener(c, h, false);
		};
		return true;
	},
	
	/**
	 * 通过指定的Element得到其所属的Component
	 * @method gJsc
	 * @param	{HTML Object}	指定的element
	 * @return	{HTML Object}	所属的component
	 */
	gJsc: function(o) {
		var ot = o
		do{
			if (ot.getAttribute("c_type")) {
				return ot;
			}
			if (ot.parentNode) {
				ot = ot.parentNode;
			} else {
				return null;
			}
		} while (true);
	},
	
	/**
	 * component的事件处理，相当于一个分发器，通过反射调用相应的事件处理方法
	 * @method evtHandler
	 * @param {Event Object} 可选的事件对象
	 */
	evtHandler: function(){
		var eo = window.event ? window.event : arguments[0];
		var tar = _jsc.evt.gTar(eo);
		var jsc = _jsc.evt.gJsc(tar).jsc;
		et = eo.type;
		eval("var h = jsc.jsc" + et);
		h(tar, jsc);
	}
};